package com.chen.function_demo.chapter3;

import java.util.UUID;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * 第三章第三节
 * @author 陈哲<p>
 * ================================<p>
 * Date: 2025/5/12<p>
 * Time: 11:02<p>
 * ================================
 */
public class Section3 {
    /*
        生成硫：不用现有数据生成stream对象
        1、简单生成：range();注：range()方法是IntStream中独有的方法
        2、iterate()：依赖上一个值生成当前值
        迭代器，迭代器可以生成一个无限的流，所以需要使用limit()方法来限制流中元素的个数
        3、generate(Supplier<? extends T> supplier)：不依赖上一个值生成当前值
     */
    public static void main(String[] args) {
        //IntStream.range()给的范围是左闭右开的，即含头不含尾 ，所以打印结果是1~9
        IntStream.range(1, 10).forEach(System.out::println);
        System.out.println("------------------------------------");
        // IntStream.rangeClosed()范围是左闭右闭的，即含头含尾，所以打印结果是1~10
        IntStream.rangeClosed(1, 10).forEach(System.out::println);
        System.out.println("====================================");
        // iterate() 生成一个奇数流 1,3,5,7,9 五个元素
        IntStream.iterate(1, n -> n + 2).limit(5).forEach(System.out::println);
        // 跟上面同效果，这个三个入参，第二个入参是个Predicate，判断是否继续迭代
        IntStream.iterate(1, n -> n < 10,n -> n + 2).forEach(System.out::println);
        System.out.println("------------------------------------");
        Stream.iterate("a", n -> n + "a").limit(5).forEach(System.out::println);
        System.out.println("====================================");
        // generate() 生成一个随机数流，这个方法需要传入一个Supplier，这个方法会生成一个流，这个流是无限的，所以需要使用limit()方法来限制流中元素的个数
        IntStream.generate(() -> (int) (Math.random() * 100)).limit(5).forEach(System.out::println);
        Stream.generate(UUID::randomUUID).limit(5).forEach(System.out::println);
    }
}
